tidymodelsでモデリング 事始め

Kuro

はじめに

自己紹介

  • @Kuroとか くろきち とか
    • アカウント名の由来はむかーしのっていたカワサキの900ccの赤とKAZE(カワサキライダーズクラブ)とをくっつけた。
  • 電通国際情報サービスとかいうSIerでAI関係の仕事しています。
  • 主にPMと教育事業担当
  • 仕事ではほぼプログラム書きません。
  • Rに最初にさわったのは大学の頃だから、、、、、20年以上まえですかね? ≠ R歴

本日のセッションで説明すること

  • 機械学習界隈におけるモデリングってなんぞや?
  • R でどうやるのがナウい?(死語)

。。。。。。

と思ったんだが、 BING Chatさんが素晴しいので最初の一方を話そうかなと

モデリングとは?

広義(ウィキペディア)

科学的モデリング(かがくてきモデリング、英: Scientific > modelling)とは、ある事象の抽象化されたコンセプトモデル・グラフィカルモデル・あるいは数理モデルを作るプロセスである。

機械学習領域(私見)

(過去に)定義された数式(アルゴリズム)に実データをあてはめ、現象にあわせた数理モデルをつくるための試行錯誤を含む行為および そのモデルの確からしさを確認する行為。

ざっくりあわらわすと

以下のような行為をゴールにむけて何度も行うこと

参考 : データ分析のワークフロー

Wickham and Grolemund(2016) より作成

モデリング内で沢山のタスクをこなしながら目的を達成していく必要がある

モデリングで実施するタスク(例)

  1. モデルの選択
    • 複数モデル適用と評価
      ランダムフォレスト Lasso ニューラルネットワーク
    • タスク設定
      回帰でやるのか? 分類でいくのか?
    • ハイパーパラメータチューニング(初期設定値みたいなもの)
  2. 評価の決定
    • 複数指標の検討
      RMSEが良いのか?RMSLEがよいのか?
    • 汎用性能検討
      過学習していないか?
    • 過去のモデルと比較の比較
    • サンプリング方法
      クロスバリデーションする?

モデリング内で沢山のタスクをこなしながら目的を達成していく必要がある

モデリングで実施するタスク(例)

  1. データの処置
    • 特徴量エンジニアリング
    • 欠損値対応等
      欠損は削除する?補完する?

等々

tidymodels

モデリングにかかわる各種のタスクを統一的にできるよう各種のパッケージを包含しつかいやすくしたもの。

まずこれいれておけば、大体解決できると思えば良い。 1

─── tidymodels 1.0.0 ──
✔ broom        1.0.4     ✔ recipes      1.0.5
✔ dials        1.1.0     ✔ rsample      1.1.1
✔ dplyr        1.1.1     ✔ tibble       3.2.1
✔ ggplot2      3.4.1     ✔ tidyr        1.3.0
✔ infer        1.0.4     ✔ tune         1.0.1
✔ modeldata    1.1.0     ✔ workflows    1.1.3
✔ parsnip      1.0.4     ✔ workflowsets 1.0.0
✔ purrr        1.0.1     ✔ yardstick    1.1.0
✔ broom        1.0.4     ✔ recipes      1.0.5
✔ dials        1.1.0     ✔ rsample      1.1.1
✔ dplyr        1.1.1     ✔ tibble       3.2.1
✔ ggplot2      3.4.1     ✔ tidyr        1.3.0
✔ infer        1.0.4     ✔ tune         1.0.1
✔ modeldata    1.1.0     ✔ workflows    1.1.3
✔ parsnip      1.0.4     ✔ workflowsets 1.0.0
✔ purrr        1.0.1     ✔ yardstick    1.1.0

タスクと包含パッケージとの関係例

タスク パッケージ
サンプリング rsample
前処理 dplyr purrr tidyr
パラメータサーチ tune dials
モデルの性能評価 yardstick
可視化 ggplot2

今日覚えてもらうこと

tydymodelsをつかって以下の3つについてちょっとわかってもらいます。

  1. モデリングまでの一連の流れ(コードベース)
  2. サンプリング
  3. モデル適用
  4. 評価

モデリングまでの一連の流れ(コードベース)

> # ライブラリの読み込み
> library(tidyverse)
> library(tidymodels)
> # アルゴリスムこれだけはインストールされないので別途install_packageする。
> library(ranger)
> 
> # データの読み込み
> # CSVから読みこむときは下記
> # data <- readr::read_csv("path/to/aaaa.csv")
> # 今回は[iris]を利用
> iris_df <- iris %>% as_tibble()
> 
> # データの前処理
> iris_df <- iris_df %>%
+   mutate(Species = as.factor(Species))
> 
> # データの分割
> set.seed(123)
> split <- initial_split(iris_df, prop = 0.7)
> train_data <- training(split)
> test_data <- testing(split)
> 
> # モデルの定義
> rf_spec <- rand_forest(mtry = 3, trees = 500) %>%
+   set_mode("classification") %>%
+   set_engine("ranger")
> 
> # モデルの学習
> rf_fit <- rf_spec %>%
+   fit(Species ~ ., data = train_data)
> 
> # モデルの評価
> rf_fit %>%
+   predict(test_data) %>%
+   bind_cols(test_data) %>%
+   metrics(truth = Species, estimate = .pred_class)
# A tibble: 2 × 3
  .metric  .estimator .estimate
  <chr>    <chr>          <dbl>
1 accuracy multiclass     0.978
2 kap      multiclass     0.966

サンプリング : resample パッケージ

モデルの性能を評価するために入力データを学習データ(train)と評価データ(test)に分割します。

なぜ?

学習に利用したデータ=既知(モデルが知っている)なので、モデルの評価に利用するとカンニングになる。
このカンニングのことを、リーケージとよぶ。
評価の為に新しくデータを用意できればよいが現実的ではないので、今あるデータを2つに分割して既知(学習データ)と未知(評価データ)として便宜あつかいます。

> library(rsample)
> df <- iris
> 
> # 学習:評価=8:2で分割するよという宣言
> df_split <- initial_split(df, prop=0.8)
> 
> # 学習データ抽出
> df_train <- training(df_split)
> 
> #評価データ抽出
> df_test <- testing(df_split)
> 
> paste(nrow(df),nrow(df_train),nrow(df_test),sep=" - ")
[1] "150 - 120 - 30"

モデル適用 : persnipパッケージ

機械学習タスクや利用するアルゴリズムやハイパーパラメータなどを設定し、実際にデータを当てはめ(学習)ます。

# モデルの定義
rf_spec <- 
  rand_forest(mtry = 3, trees = 500) %>%
  set_mode("classification") %>%
  set_engine("ranger")

# モデルの学習
rf_fit <- rf_spec %>%
  fit(Species ~ ., data = train_data)

# モデルの評価
pred <- rf_fit %>%
  predict(test_data)

モデル適用 : persnipパッケージ

# モデルの定義
rf_spec <- 
  rand_forest(mtry = 3, trees = 500) %>%
  set_mode("classification") %>%
  set_engine("ranger")

# モデルの学習
rf_fit <- rf_spec %>%
  fit(Species ~ ., data = train_data)

# モデルの評価
pred <- rf_fit %>%
  predict(test_data)

利用できるモデルを知るには?

どんなアルゴリズムに対応しているかは下記をチェック
Explore tidymodels - Search parsnip models

モデル適用 : persnipパッケージ

# モデルの定義
rf_spec <- 
  rand_forest(mtry = 3, trees = 500) %>%
  set_mode("classification") %>%
  set_engine("ranger")

# モデルの学習
rf_fit <- rf_spec %>%
  fit(Species ~ ., data = train_data)

# あえて説明変数を絞りたい場合は`+`でつなぐとよい。
#rf_fit <- rf_spec %>%
#  fit(Species ~ Sepal.Length+Sepal.Width, data = train_data)

# モデルの評価
pred <- rf_fit %>%
  predict(test_data)

formula

目的変数 ~(チルダ) .(ドット)でつないているところがformulaです。
.(ドット)は目的変数以外の全てをあらわします。
説明変数を明示的に示す場合は+でつなぐとよいです。
一部だけ利用するようなシーンは一般的ではなく、前処理で事前に落しておくのが一般的です。

評価

最後にネタバラしもふくめて

本セッションで活用したコードは、ChatGPTさんに聞いて作ったものになります。
ググるのも良いのですが、コード界隈はChatGPTさんが素晴しいです。
まずコードを読み、わからないところを調べる方が効率的でもありますので是非活用してみてください!!

以下がプロンプト例になります。

機械学習モデルの学習スクリプトの例を示してください。

以下の要件を満してください
- 言語: R言語 
- ライブラリ: tidyverse tidymodel,ranger
- アルゴリズム: randomforest
- データセット名: ああああ 
  - 目的変数: 目的変数
  - 説明変数: t1,t2,t3,t4,t5,ma1,ma2
- タスク: 回帰
- データ分割: 7:3
- 交差検証: false

EOF
Thank you!!

これに対する回答は?

付帯要素

- CRANのすすめ

- こまったときのNEXTアクション

    - rwakarang

    - HELP

    - viggnet

    - F2ボタン

最後に

つぎ何をみるとよいか?

- \[9 モデルの有効性の判断 \|Rによる整頓されたモデリング (tmwr.org)\](https://www.tmwr.org/performance.html)

- 参考文献

- [tidymodels で分類モデルをハイパーパラメータ・チューニングして学習して予測して評価する - Qiita\](https://qiita.com/KotaYoneda/items/1cde4d5b4c36ebdf0e72)

- [tidymodelsによるtidyな機械学習(その1:データ分割と前処理から学習と性能評価まで) - Dropout (hatenablog.com)](https://dropout009.hatenablog.com/entry/2019/01/06/124932#tidy%E3%81%AA%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%95%E3%83%AD%E3%83%BC)

- [Rユーザのためのtidymodels\[実践\]入門 〜モダンな統計・機械学習モデリングの世界:書籍案内|技術評論社 (gihyo.jp)](https://gihyo.jp/book/2023/978-4-297-13236-1)

- [【R】tydymodelsを用いてlightgbmをやってみる(その3) - Qiita](https://qiita.com/kenkenvw/items/d605050a88636cd677e7)

- [R と tidymodels を使用して機械学習モデルを作成する - Training | Microsoft Learn](https://learn.microsoft.com/ja-jp/training/paths/machine-learning-with-r/)

- [【tidymodels講座1】当講座の概要 - データサイエンスの道標 (datasciencemore.com)](https://datasciencemore.com/r-tidymodels-overview/)

- [www.bing.com](https://www.bing.com/ck/a?!&&p=2e05a1addb3ff7d8JmltdHM9MTY3OTc4ODgwMCZpZ3VpZD0xNTRhNDMwZC00MTcwLTY2YzctMGM5MS01Mjc1NDAwYTY3NDEmaW5zaWQ9NTI3Mw&ptn=3&hsh=3&fclid=154a430d-4170-66c7-0c91-5275400a6741&psq=tidymodels+R&u=a1aHR0cHM6Ly9xaWl0YS5jb20vUmluZ2FfaHlqL2l0ZW1zLzdmZWQ5YTNhN2NjMjVjZGZhNjk1&ntb=1)

- [www.bing.com](https://www.bing.com/ck/a?!&&p=e4c65784a040f81eJmltdHM9MTY3OTc4ODgwMCZpZ3VpZD0xNTRhNDMwZC00MTcwLTY2YzctMGM5MS01Mjc1NDAwYTY3NDEmaW5zaWQ9NTMxNA&ptn=3&hsh=3&fclid=154a430d-4170-66c7-0c91-5275400a6741&psq=tidymodels+R&u=a1aHR0cHM6Ly9kYXRhc2NpZW5jZW1vcmUuY29tL3ItdGlkeW1vZGVscy10aWR5dmVyc2Uv&ntb=1)

- [Books \- Tidy Modeling with R](https://www.tidymodels.org/books/tmwr/)
- [tidymodelsで覚えるRでのモデル構築と運用 / tidymodels2020 \- Speaker Deck](https://speakerdeck.com/s_uryu/tidymodels2020)
- [ご注文は学習済モデルの確認ですか?BROOM【tidymodels, broom】 \- Qiita](https://qiita.com/Ringa_hyj/items/7fed9a3a7cc25cdfa695)
- [【tidymodels講座2】\{tidyverse\}探索的データ分析 \- データサイエンスの道標](https://datasciencemore.com/r-tidymodels-tidyverse/)

脚注

  1. アルゴリズムについては数が多いので別にインストールは必要